package com.pai4j.connect.messagequeue.consumer.service;

import com.pai4j.common.constants.ConnectConstants;
import com.pai4j.common.util.JsonUtil;
import com.pai4j.connect.websocket.handler.ChatWebSocketEndPointServletHandler;
import com.pai4j.domain.vo.request.mess.MessageNotifyVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.Set;

@Slf4j
@Service
public class ChatNotifyConsumeService {


    /**
     * 处理消息提醒通知
     *
     * @param message
     */
    public void doNotify(String message) {
        // 1. 反序列化消息对象
        MessageNotifyVO messageNotify = JsonUtil.fromJson(message, MessageNotifyVO.class);
        // 2. 获取消息接受人的 webSocket session
        String receiver = messageNotify.getReceiverId();
        // 3. 获取接受人ws session
        /**
         * 下面的做法，可以支持多端消息推送
         */
        Set<String> bizCodes = ConnectConstants.ConnectBiz.getBizCode(ConnectConstants.BizEnum.INDEX);
        for (String bizCode : bizCodes) {
            WebSocketSession wsSession = ChatWebSocketEndPointServletHandler.getSession(bizCode, receiver);
            /**
             * 以下两种场景不直接推送：
             *
             * 1. 在分布式场景下，每个用户的ws链接可能会落在不同的节点，所以广播模式下有可能当前节点拿不到接受人的ws session
             * 2. wssession 是一个有状态的长链接（tomcat来管理状态的），可能存在session状态异常
             */
            if (wsSession == null || !wsSession.isOpen()) {
                continue;
            }
            WebSocketMessage<?> wsMessage = new TextMessage(message);
            try {
                wsSession.sendMessage(wsMessage);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}
